package cn.lijian.goods.cart.dao;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.MapHandler;
import org.apache.commons.dbutils.handlers.MapListHandler;

import cn.itcast.commons.CommonUtils;
import cn.itcast.jdbc.TxQueryRunner;
import cn.lijian.goods.book.domain.Book;
import cn.lijian.goods.cart.domain.CartItem;
import cn.lijian.goods.user.domain.User;

public class CartItemDao {
	private QueryRunner qr=new TxQueryRunner();
	
	public List<CartItem> loadCartItemIds(String cartItemIds) throws SQLException{
		Object[]cartItemIdArray=cartItemIds.split(",");
		String whereSql=toWhereSql(cartItemIdArray.length);
		String sql="select * from t_cartitem c,t_book b where c.bid=b.bid and "+whereSql;
		
		return toCartItemList(qr.query(sql, new MapListHandler(),cartItemIdArray));
		
	}
	
	/**
	 * 生成 where 子句
	 * @param len
	 * @return
	 * @author lijian
	 */
	private String toWhereSql(int len){
		StringBuilder sb=new StringBuilder("cartItemId in(");
		for(int i=0;i<len;i++){
			sb.append("?");
			if(i<len-1){
				sb.append(",");
			}
		}
		sb.append(")");
		return sb.toString();
	}

	/**
	 * 按 ID 查询
	 * @param cartItemId
	 * @return
	 * @author lijian
	 * @throws SQLException 
	 */
	public CartItem findByCartItemId(String cartItemId) throws SQLException{
		String sql="select * from t_cartitem c,t_book b where c.bid=b.bid and c.cartitemid=?";
		Map<String,Object>map=qr.query(sql, new MapHandler(),cartItemId);
		return toCartItem(map); 
	}
	
	/**
	 * 批量删除
	 * @param cartItemIds
	 * @throws SQLException
	 * @author lijian
	 */
	public void batchDelete(String cartItemIds) throws SQLException{
		Object[]cartItemIdArray=cartItemIds.split(",");
		String whereSql=toWhereSql(cartItemIdArray.length);
		String sql="delete from t_cartitem where "+whereSql;
		qr.update(sql,cartItemIdArray);//catItemIdArray 必须是 object 数组
	}
	
	/**
	 * 查询某个用户的某本图书是否存在
	 * @return
	 * @author lijian
	 * @throws SQLException 
	 */
	public CartItem findByUidAndBid(String uid,String bid) throws SQLException{
		String sql="select * from t_cartitem where uid=? and bid=?";
		Map<String,Object>map=qr.query(sql, new MapHandler(),uid,bid);
		CartItem cartItem=toCartItem(map);
		return cartItem;
	}
	/**
	 * 修改指定条目的数量
	 * @param cartItemId
	 * @param quantity
	 * @author lijian
	 * @throws SQLException 
	 */
	public void updateQuantity(String cartItemId,int quantity) throws SQLException{
		String sql="update t_cartitem set quantity=? where cartItemId=?";
		qr.update(sql,quantity,cartItemId);
	}
	/**
	 * 添加条目
	 * @param cartItem
	 * @author lijian
	 * @throws SQLException 
	 */
	public void addCartItem(CartItem cartItem) throws SQLException{
		String sql="insert into t_cartitem(cartItemId,quantity,bid,uid) values(?,?,?,?)";
		Object[]params={cartItem.getCartItemId(),cartItem.getQuantity(),cartItem.getBook().getBid(),cartItem.getUser().getUid()};
		
		qr.update(sql,params);
	}
	
	/**
	 * 把一个 map 映射成 一个 cartitem 
	 * @param map
	 * @return
	 * @author lijian
	 */
	private CartItem toCartItem(Map<String,Object>map){
		if(map==null||map.size()==0){
			return null;
		}
		CartItem cartItem=CommonUtils.toBean(map, CartItem.class);
		Book book =CommonUtils.toBean(map, Book.class);
		User user=CommonUtils.toBean(map, User.class);
		
		cartItem.setBook(book);
		cartItem.setUser(user);
		
		return cartItem;
		
	}
	/**
	 * 把 多个 map 映射成 多个 cartitem
	 * @param list
	 * @return
	 * @author lijian
	 */
	private List<CartItem> toCartItemList(List<Map<String,Object>>list){
		List<CartItem> cartItemList=new ArrayList<CartItem>();
		for(Map<String,Object> map : list){
			 CartItem cartItem=toCartItem(map);
			 cartItemList.add(cartItem);
		}
		return cartItemList;
	}
	/**
	 * 通过用户查询购物车条目
	 * @param uid
	 * @return
	 * @author lijian
	 * @throws SQLException 
	 */
	public List<CartItem> findByUser(String uid) throws SQLException{
		String sql="select * from t_cartitem c,t_book b where c.bid=b.bid and uid=? order by c.orderBy";
		List<Map<String,Object>>mapList=qr.query(sql, new MapListHandler(),uid);
		return toCartItemList(mapList);
	}
}
